package com.sky.utils;

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.sky.properties.AliOssProperties;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.ByteArrayInputStream;

/**
 *  文件上传工具类（阿里云）
 */
@Slf4j
@Component
public class AliOssUtil {
    @Autowired
    AliOssProperties ossProperties;

    public String upload(byte[] bytes, String objectName) {
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(ossProperties.getEndpoint(), ossProperties.getAccessKeyId(), ossProperties.getAccessKeySecret());

        try {
            // 创建PutObject请求。
            // 将文件字节数组上传到指定的存储桶和对象名称
            ossClient.putObject(ossProperties.getBucketName(), objectName, new ByteArrayInputStream(bytes));
        } catch (OSSException oe) {
            // 捕获OSSException异常，表示请求到达了OSS，但由于某些原因被拒绝并返回了错误响应。
            System.out.println("捕获到OSSException，表示你的请求到达了OSS，但由于某些原因被拒绝并返回了错误响应。");
            System.out.println("错误信息:" + oe.getErrorMessage());
            System.out.println("错误代码:" + oe.getErrorCode());
            System.out.println("请求ID:" + oe.getRequestId());
            System.out.println("主机ID:" + oe.getHostId());
        } catch (ClientException ce) {
            // 捕获ClientException异常，表示客户端在尝试与OSS通信时遇到了严重的内部问题，例如无法访问网络。
            System.out.println("捕获到ClientException，表示客户端在尝试与OSS通信时遇到了严重的内部问题，例如无法访问网络。");
            System.out.println("错误信息:" + ce.getMessage());
        } finally {
            // 无论是否发生异常，最后都要关闭OSSClient实例以释放资源。
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }

        // 构建文件访问路径，格式为 https://BucketName.Endpoint/ObjectName
        StringBuilder stringBuilder = new StringBuilder("https://");
        stringBuilder
                .append(ossProperties.getBucketName())    // 追加存储桶名称
                .append(".")          // 追加点号作为分隔符
                .append(ossProperties.getEndpoint())    // 追加Endpoint
                .append("/")         // 追加斜杠作为路径分隔符
                .append(objectName); // 追加对象名称

        // 记录日志，输出文件上传到的位置
        log.info("文件上传到:{}", stringBuilder.toString());

        // 返回文件访问URL
        return stringBuilder.toString();
    }
}




//@Data
//@AllArgsConstructor
//@Slf4j
//public class AliOssUtil {
//
//    private String endpoint; // 比如 "http://oss-cn-hangzhou.aliyuncs.com"
//    private String accessKeyId;// 比如 "C000000000000000000"
//    private String accessKeySecret;// 比如 "C000000000000000000"
//    private String bucketName; // 比如 "examplebucket"
//
//    /**
//     * 文件上传
//     * @param bytes 文件字节数组
//     * @param objectName 对象名称
//     * @return 文件访问URL
//     */
//    public String upload(byte[] bytes, String objectName) {
//
//        // 创建OSSClient实例。
//        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
//
//        try {
//            // 创建PutObject请求。
//            // 将文件字节数组上传到指定的存储桶和对象名称
//            ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(bytes));
//        } catch (OSSException oe) {
//            // 捕获OSSException异常，表示请求到达了OSS，但由于某些原因被拒绝并返回了错误响应。
//            System.out.println("捕获到OSSException，表示你的请求到达了OSS，但由于某些原因被拒绝并返回了错误响应。");
//            System.out.println("错误信息:" + oe.getErrorMessage());
//            System.out.println("错误代码:" + oe.getErrorCode());
//            System.out.println("请求ID:" + oe.getRequestId());
//            System.out.println("主机ID:" + oe.getHostId());
//        } catch (ClientException ce) {
//            // 捕获ClientException异常，表示客户端在尝试与OSS通信时遇到了严重的内部问题，例如无法访问网络。
//            System.out.println("捕获到ClientException，表示客户端在尝试与OSS通信时遇到了严重的内部问题，例如无法访问网络。");
//            System.out.println("错误信息:" + ce.getMessage());
//        } finally {
//            // 无论是否发生异常，最后都要关闭OSSClient实例以释放资源。
//            if (ossClient != null) {
//                ossClient.shutdown();
//            }
//        }
//
//        // 构建文件访问路径，格式为 https://BucketName.Endpoint/ObjectName
//        StringBuilder stringBuilder = new StringBuilder("https://");
//        stringBuilder
//                .append(bucketName)    // 追加存储桶名称
//                .append(".")          // 追加点号作为分隔符
//                .append(endpoint)    // 追加Endpoint
//                .append("/")         // 追加斜杠作为路径分隔符
//                .append(objectName); // 追加对象名称
//
//        // 记录日志，输出文件上传到的位置
//        log.info("文件上传到:{}", stringBuilder.toString());
//
//        // 返回文件访问URL
//        return stringBuilder.toString();
//    }
//}
